import * as Cesium from "cesium"

/**
 * 生成箭头多边形的顶点数组（等腰三角形箭头 + 矩形箭身）
 * @param start 起点坐标
 * @param end 终点坐标
 * @param arrowSizeRatio 箭头大小相对于线段长度的比例（0-1）
 * @returns 箭头多边形的顶点数组（7个点）
 */
export function generateArrowPolygon(
  start: Cesium.Cartesian3,
  end: Cesium.Cartesian3,
  arrowSizeRatio: number = 0.25,
): Cesium.Cartesian3[] {
  if (start.equals(end)) {
    return []
  }
  // 计算方向向量和距离
  const vector = Cesium.Cartesian3.subtract(end, start, new Cesium.Cartesian3())
  const distance = Cesium.Cartesian3.magnitude(vector)
  const direction = Cesium.Cartesian3.normalize(vector, new Cesium.Cartesian3())

  // 计算垂直方向（右侧）
  const right = Cesium.Cartesian3.normalize(
    Cesium.Cartesian3.cross(
      direction,
      Cesium.Cartesian3.UNIT_Z,
      new Cesium.Cartesian3(),
    ),
    new Cesium.Cartesian3(),
  )

  // 根据距离按比例计算箭头和箭身尺寸
  const arrowLength = distance * arrowSizeRatio // 箭头长度
  const arrowBaseWidth = arrowLength * 0.6 // 箭头底边宽度
  const bodyWidth = arrowBaseWidth * 0.5 // 箭身宽度

  // 计算箭头起点（从终点往回退箭头长度）
  const arrowStart = Cesium.Cartesian3.multiplyByScalar(
    direction,
    distance - arrowLength,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(start, arrowStart, arrowStart)

  // 计算箭身矩形的四个顶点
  const bodyLeft1 = Cesium.Cartesian3.multiplyByScalar(
    right,
    -bodyWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(start, bodyLeft1, bodyLeft1)

  const bodyRight1 = Cesium.Cartesian3.multiplyByScalar(
    right,
    bodyWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(start, bodyRight1, bodyRight1)

  const bodyLeft2 = Cesium.Cartesian3.multiplyByScalar(
    right,
    -bodyWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(arrowStart, bodyLeft2, bodyLeft2)

  const bodyRight2 = Cesium.Cartesian3.multiplyByScalar(
    right,
    bodyWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(arrowStart, bodyRight2, bodyRight2)

  // 计算箭头三角形的两个底角顶点
  const arrowLeft = Cesium.Cartesian3.multiplyByScalar(
    right,
    -arrowBaseWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(arrowStart, arrowLeft, arrowLeft)

  const arrowRight = Cesium.Cartesian3.multiplyByScalar(
    right,
    arrowBaseWidth / 2,
    new Cesium.Cartesian3(),
  )
  Cesium.Cartesian3.add(arrowStart, arrowRight, arrowRight)

  // 返回7个顶点数组，形成闭合多边形
  return [
    bodyLeft1, // 箭身起点左侧
    bodyLeft2, // 箭身终点左侧
    arrowLeft, // 箭头左侧底角
    end, // 箭头顶点
    arrowRight, // 箭头右侧底角
    bodyRight2, // 箭身终点右侧
    bodyRight1, // 箭身起点右侧
  ]
}
